package com.abner.design.patterns.singleton;

/**
 * 线程安全懒汉式
 * @Author: abner
 * @Date: 2022-04-22-11:10
 **/
public class SingletonType4 {

    public static void main(String[] args) {
        Singleton4 instance1 = Singleton4.getInstance4();
        Singleton4 instance2 = Singleton4.getInstance4();
        System.out.println(instance1 == instance2);
        System.out.println(instance1.hashCode() == instance2.hashCode());
    }
}

/**
 * 优缺点：
 *  1) 解决了线程安全问题
 *  2) 效率太低了，每个线程在想获得类的实例时候，执行 getInstance()方法都要进行同步。而其实这个方法只执行
 *      一次实例化代码就够了，后面的想获得该类实例，直接 return 就行了。方法进行同步效率太低
 *  3) 结论：在实际开发中，不推荐使用这种方式
 *
 *  这样写也是有问题的
 *          if(null == singleton4) {
 *             synchronized (Singleton4.class) {
 *                 singleton4 = new Singleton4();
 *             }
 *         }
 */
class Singleton4 {

    private static Singleton4 singleton4;

    private Singleton4() {};

    public static synchronized Singleton4 getInstance4() {
        if(null == singleton4) {
            singleton4 = new Singleton4();
        }
        return singleton4;
    }
}
